# （一）元类的定义
"""
我们知道了Python中的类也是对象。元类就是用来创建这些类（对象）的
元类就是类的类。元类并不是某一个类的名字，它是一个概念。
它是一种Python的思想。

type是在Python中用来创建所有类的元类
"""


a = 'abc'
b = 100

# __class__ 表示某个对象的类
print(a.__class__)  # a这个实例对象是由str类创建的
print(a.__class__.__class__)  # str这个类是由type创建的
print(a.__class__.__class__.__class__)  # type类是由type创建的


# （二）自定义元类
# 1、通过函数的方式
def UpperMetaClass(class_name, class_parents, class_attrs):
    """ 所有的类中的所有属性名都改成大写，私有属性除外 """
    attrs = dict((name.upper(), value) for name, value in class_attrs.items() if not name.startswith('__'))
    return type(class_name, class_parents, attrs)


class Person(object, metaclass=UpperMetaClass):
    name = 'zs'


print(hasattr(Person, 'name'))
print(hasattr(Person, 'NAME'))

# 2、通过类的方式
class UpperMetaClass(type):
    """ 自己通过类的方式定义的元类，必须要继承type"""
    # 必须重些__new__函数

    def __new__(cls, class_name, class_parents, class_attrs):
        attrs = dict((name.upper(), value) for name, value in class_attrs.items() if not name.startswith('__'))
        # return type(class_name, class_parents, attrs)
        return super(UpperMetaClass, cls).__new__(cls, class_name, class_parents, attrs)


p = UpperMetaClass('Person', (object,), {'name': 'lisi'})

print(hasattr(p, 'name'))

